package br.org.isvi.interpretador.portugol.operations;

import br.org.isvi.interpretador.portugol.InterpreterResolver;
import br.org.isvi.interpretador.portugol.OperationResolver;
import br.org.isvi.interpretador.portugol.exception.SemanticErrorException;
import br.org.isvi.interpretador.portugol.types.IntegerSymbol;
import br.org.isvi.interpretador.portugol.types.NumberSymbol;
import br.org.isvi.interpretador.portugol.types.RealSymbol;
import br.org.isvi.interpretador.portugol.types.Symbol;
import br.org.isvi.interpretador.portugol.types.Variable;
import br.org.isvi.interpretador.portugol.types.VariableType;

public class AssignResolver implements OperationResolver {
	
	private Variable var;
	
	
	
	public AssignResolver() {
		super();
	}

	public Symbol execute() {
		
		Symbol value = InterpreterResolver.instance.popStack();
		var = (Variable)InterpreterResolver.instance.popStack();
		
		value = Variable.castToVarTypeIfPossible(value, var);
		
		if(var.compatible(value)) {
			
			InterpreterResolver.instance.setVariable(var, value);
//			var.setValue(value);
		} else {
			throw new SemanticErrorException("Tipo atribuido a variavel " + var.getName() + " é não está de acordo com o declarado!");
		}
		
		return null;
	}

	

	
}
